home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / program / cdbind01.zoo / cdromio.h < prev    next >
C/C++ Source or Header  |  1994-05-16  |  9KB  |  286 lines

  1. /*
  2.     CD-ROM Fcntl()s and structures
  3.     
  4.     Copyright (c) Julian F. Reschke (jr@ms.maus.de), 16. Mai 1994
  5.     Free distribution and usage allowed as long as the file remains 
  6.     unchanged.
  7.  
  8.     These Fcntl() opcodes provide a *nix-like interface to the CD-ROM     
  9.     specific functions. They can be used either with a MiNT specific     
  10.     CD-ROM device driver or with new MetaDOS BOS lowlevel drivers. For 
  11.     MiNT mounted device drivers, the interface is
  12.     
  13.         Fcntl (short filehandle, short opcode, long arg)
  14.         
  15.     (with filehandle a handle to the opened CDROM device driver) or
  16.     
  17.         Dcntl (short opcode, char *name, long arg)
  18.     
  19.     (with name being the name of a file or directory on the mounted CD 
  20.     file system).
  21.         
  22.     For MetaDOS BOS drivers, the interface is
  23.     
  24.         xbios (0x37, short device, long magic, short opcode, long arg)
  25.     
  26.     where 'device' is a MetaDOS XBIOS device number ('A'..'Z') and 'magic' 
  27.     is 'FCTL'. With MetaDOS version >= 2.40 and the appropriate DOS 
  28.     drivers, you can also use the GEMDOS call Dcntl (thus being compatible 
  29.     to future MiNT drivers), because MetaDOS 2.40 implements some of the 
  30.     new GEMDOS calls and Atari's ISO9660F.DOS passes all Dcntl calls right 
  31.     down to the BOS driver.
  32.     
  33.     Note that there is an 'old' CD-ROM audio interface for MetaDOS, but 
  34.     the commands depend on the custom CDAR 504 controller and can't be 
  35.     fully implemented for SCSI drives (in fact they are, with some 
  36.     restrictions). Consult the MetaDOS developers manual for further 
  37.     information.
  38.     
  39.     In both cases, EINVFN (-32L) is returned for unknown opcodes.
  40.     
  41.     Note that MetaDOS drivers return EUNKNOWN (-3) if XBIOS opcode 0x37 is 
  42.     not supported!
  43.     
  44.     Drivers supporting this interface (send updates to jr@ms.maus.de):
  45.     
  46.     MetaDOS BOS drivers (driver name, company):
  47.  
  48.         HS-CDROM.BOS
  49.             Hard &Soft, Castrop-Rauxel, Germany
  50.             Generic driver for SCSI-CDROMs connected to ACSI or SCSI and 
  51.             for the CDAR504
  52.  
  53.         FX001???.BOS, CDU33???.BOS
  54.             Gellermann & Fellmuth GbR, Berlin, Germany
  55.             Drivers for Mitsumi drives connected to internal or parallel 
  56.             interface.
  57.  
  58.     MiNT device drivers (driver name, company):
  59.         -
  60. */
  61.  
  62. #ifndef _CDROMIO_H
  63. #define _CDROMIO_H
  64.  
  65. #ifndef BYTE
  66. #define BYTE unsigned char
  67. #endif
  68.  
  69. typedef union
  70.     struct {
  71.         BYTE  reserved, minute, second, frame;
  72.     } msf;
  73.     long lba;
  74. } cd_ad;
  75.  
  76. /* Data structures used */
  77.  
  78. struct cdrom_msf 
  79. {
  80.     BYTE    cdmsf_min0;     /* start minute */
  81.     BYTE    cdmsf_sec0;     /* start second */
  82.     BYTE    cdmsf_frame0;   /* start frame */
  83.     BYTE    cdmsf_min1;     /* end minute */
  84.     BYTE    cdmsf_sec1;     /* end second */
  85.     BYTE    cdmsf_frame1;   /* end frame */
  86. };
  87.  
  88. struct cdrom_ti 
  89. {
  90.     BYTE    cdti_trk0;      /* start track */
  91.     BYTE    cdti_ind0;      /* start index */
  92.     BYTE    cdti_trk1;      /* end track */
  93.     BYTE    cdti_ind1;      /* end index */
  94. };
  95.  
  96. struct cdrom_tochdr     
  97. {
  98.     BYTE    cdth_trk0;      /* start track */
  99.     BYTE    cdth_trk1;      /* end track */
  100. };
  101.  
  102. struct cdrom_tocentry 
  103. {
  104.     /* input parameters */
  105.  
  106.     BYTE    cdte_track;     /* track number or CDROM_LEADOUT */
  107.     BYTE    cdte_format;    /* CDROM_LBA or CDROM_MSF */
  108.     
  109.     /* output parameters */
  110.  
  111.     unsigned    cdte_adr:4;     /* the SUBQ channel encodes 0: nothing,
  112.                                     1: position data, 2: MCN, 3: ISRC,
  113.                                     else: reserved */
  114.     unsigned    cdte_ctrl:4;    /* bit 0: audio with pre-emphasis,
  115.                                     bit 1: digital copy permitted,
  116.                                     bit 2: data track,
  117.                                     bit 3: four channel */
  118.     BYTE    cdte_datamode;        /* currently not set */
  119.     cd_ad    cdte_addr;            /* track start */
  120. };
  121.  
  122. struct cdrom_subchnl 
  123. {
  124.     /* input parameters */
  125.  
  126.     BYTE    cdsc_format;        /* CDROM_MSF or CDROM_LBA */
  127.     
  128.     /* output parameters */
  129.     
  130.     BYTE    cdsc_audiostatus;    /* see below */
  131.     unsigned    cdsc_resvd:    8;    /* reserved */
  132.     unsigned    cdsc_adr:   4;    /* see above */
  133.     unsigned    cdsc_ctrl:  4;    /* see above */
  134.     BYTE    cdsc_trk;            /* current track */
  135.     BYTE    cdsc_ind;            /* current index */
  136.     cd_ad    cdsc_absaddr;        /* absolute address */
  137.     cd_ad    cdsc_reladdr;        /* track relative address */
  138. };
  139.  
  140. struct cdrom_mcn 
  141. {
  142.     BYTE    mcn_audiostatus;    /* see above */
  143.     BYTE    mcn_mcn[23];        /* Media catalog number as ASCII string */
  144. };
  145.  
  146. struct cdrom_tisrc
  147. {
  148.     /* input parameters */
  149.  
  150.     BYTE    tisrc_track;        /* track number */
  151.     
  152.     /* output parameters */
  153.     
  154.     BYTE    tisrc_audiostatus;    /* see above */
  155.     BYTE    tisrc_tisrc[23];    /* Track International Standard
  156.                                     Recording Code (ASCII) */
  157. };
  158.  
  159. struct cdrom_volctrl
  160. {
  161.     BYTE    channel0;            /* volume level 0..255 */
  162.     BYTE    channel1;
  163.     BYTE    channel2;
  164.     BYTE    channel3;
  165. };
  166.  
  167. struct cdrom_audioctrl
  168. {
  169.     /* input parameters */
  170.  
  171.     short    set;    /* 0 == inquire only */
  172.     
  173.     /* input/output parameters */
  174.     
  175.     struct {
  176.         BYTE selection;
  177.         BYTE volume;
  178.     } channel[4];
  179. };
  180.  
  181. struct cdrom_read      
  182. {
  183.     long    cdread_lba;            /* logical block address */
  184.     char    *cdread_bufaddr;    /* buffer pointer */
  185.     long    cdread_buflen;        /* byte count */
  186. };
  187.  
  188.  
  189. /* CD-ROM address types */
  190.  
  191. #define CDROM_LBA   0x01
  192. #define CDROM_MSF   0x02
  193.  
  194. /* SUB Q control bits */
  195.  
  196. #define CDROM_AUDIO_EMPHASIS    0x01
  197. #define CDROM_COPY_PERMITTED    0x02
  198. #define CDROM_DATA_TRACK        0x04
  199. #define CDROM_FOUR_CHANNEL      0x08
  200.  
  201. /* The leadout track is always 0xAA, regardless of # of tracks on disc */
  202.  
  203. #define CDROM_LEADOUT   0xAA
  204.  
  205. /* return value from READ SUBCHANNEL DATA */
  206.  
  207. #define CDROM_AUDIO_INVALID     0x00    /* audio status not supported */
  208. #define CDROM_AUDIO_PLAY        0x11    /* audio play operation in progress */
  209. #define CDROM_AUDIO_PAUSED      0x12    /* audio play operation paused */
  210. #define CDROM_AUDIO_COMPLETED   0x13    /* audio play successfully completed */
  211. #define CDROM_AUDIO_ERROR       0x14    /* audio play stopped due to error */
  212. #define CDROM_AUDIO_NO_STATUS   0x15    /* no current audio status to return */
  213.  
  214. /* CD-ROM Fcntl opcodes */
  215.  
  216. /* Get block number of first sector in last session of a multisession
  217.    CD. Argument points to a LONG. Used by iso9660f.dos */
  218. #define CDROMREADOFFSET     (('C'<<8)|0x00)
  219.  
  220. /* Pause audio operation */
  221. #define CDROMPAUSE          (('C'<<8)|0x01)
  222.  
  223. /* Resume audio operation */
  224. #define CDROMRESUME         (('C'<<8)|0x02)
  225.  
  226. /* Play audio. Argument points to cdrom_msf structure */
  227. #define CDROMPLAYMSF        (('C'<<8)|0x03)
  228.  
  229. /* Play audio. Argument points to cdrom_ti structure */
  230. #define CDROMPLAYTRKIND     (('C'<<8)|0x04)
  231.  
  232. /* Read header of table of contents. Argument points to cdrom_tochdr
  233.    structure */
  234. #define CDROMREADTOCHDR     (('C'<<8)|0x05)
  235.  
  236. /* Read a toc entry. Argument points to cdrom_tocentry structure */
  237. #define CDROMREADTOCENTRY   (('C'<<8)|0x06)
  238.  
  239. /* Stops spindle motor */
  240. #define CDROMSTOP           (('C'<<8)|0x07)
  241.  
  242. /* Starts spindle motor */
  243. #define CDROMSTART          (('C'<<8)|0x08)
  244.  
  245. /* Eject medium */
  246. #define CDROMEJECT          (('C'<<8)|0x09)
  247.  
  248. /* Sets audio playback volume. Argument points to cdrom_volctrl
  249.    structure. Only for compatibility to Unix drivers, see also
  250.    CDROMAUDIOCTRL */
  251. #define CDROMVOLCTRL        (('C'<<8)|0x0a)
  252.  
  253. /* Read subchannel information. Argument points to cdrom_subchnl
  254.    structure. */
  255. #define CDROMSUBCHNL        (('C'<<8)|0x0b)
  256.  
  257. /* Read Mode 2 or 1 sectors. Argument points to cdrom_read
  258.    structure. Blocks have either 2336 or 2048 bytes. */
  259. #define CDROMREADMODE2      (('C'<<8)|0x0c)
  260. #define CDROMREADMODE1      (('C'<<8)|0x0d)
  261.  
  262. /* Lock eject mechanism */
  263. #define CDROMPREVENTREMOVAL (('C'<<8)|0x0e)
  264.  
  265. /* Unlock eject mechanism */
  266. #define CDROMALLOWREMOVAL   (('C'<<8)|0x0f)
  267.  
  268. /* Control audio settings. Argument points to cdrom_audioctrl
  269.    str